home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
ZAKO02.C
< prev
next >
Wrap
Text File
|
2000-03-25
|
5KB
|
200 lines
/*
#include <stdio.h>
#include <iocslib.h>
*/
/* 地面を歩く */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../BG.H"
#include "../sound.h"
#include "../entry.h"
#include "../SUB.H"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define P_X (*((short *) (&player[0].lx))) /*lxの上位ワード*/
#define P_Y (*((short *) (&player[0].ly))) /*lyの上位ワード*/
#define PALET_MAIN 0x0500
short enemy_explode( ENEMY *ene );
static short MoveEnemyZako02(ENEMY *);
/*static void TiniEnemyZako02(ENEMY *);*/
#define PT_ST 0x18
#define PT_END 0x18+7
static HIT_XY4 hit_p[]={
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-4,8,8,
-8,-7,8,8,
-8,-8,8,8
};
static HIT_XY4 hit_o[]={
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-4,8,8,
-8,-7,8,8,
-8,-8,8,8
};
static HIT_XY4 hit_s[]={
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-2,8,8,
-8,-4,8,8,
-8,-7,8,8,
-8,-8,8,8
};
void InitEnemyZako02Hit( void )
{
short i;
for(i=1;i<8;i++){
hit_p[i].x1-=PLAYER_HIT_X;hit_p[i].y1-=PLAYER_HIT_Y;
hit_p[i].x2+=PLAYER_HIT_X;hit_p[i].y2+=PLAYER_HIT_Y;
hit_o[i].x1-=OPTION_HIT_X;hit_o[i].y1-=OPTION_HIT_Y;
hit_o[i].x2+=OPTION_HIT_X;hit_o[i].y2+=OPTION_HIT_Y;
}
}
void InitEnemyZako02(ENEMY *ene)
{
ene->info = PALET_MAIN | PRIORITY_ZAKO;
ene->vx = 0-map_vx;
ene->vy = 0;
ene->hit_p[0] = &hit_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &hit_o[0];ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit_s[0];ene->hit_s[1]=NULL;
ene->hp = 1;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyZako02;
/* ene->func_enemy_tini = TiniEnemyZako02;*/
/* entry_counter_stop = !0;*/ /* エントリーカウンター停止 */
}
static short MoveEnemyZako02( ENEMY *ene )
{
short anim_num=0;
unsigned char angle;
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = ((ene->lx += ene->vx) >> 16)-8; /*-8は表示位置をずらすため*/
ene->y = ((ene->ly += ene->vy) >> 16)-8;
switch (ene->state){
case 0: /* 回転 */
anim_num=(ene->anim_count++)/4;
ene->pt = obj_zako+PT_ST+anim_num;
if( anim_num > 4 ){
if( player[0].lx > ene->lx ) /* プレイヤーの方にジャンプ */
ene->vx= 1*65536-map_vx;
else
ene->vx=-1*65536-map_vx;
ene->vy=-2*65536;
ene->state++;
}
break;
case 1: /* ジャンプ中 */
ene->vy+=4096;
if( ene->vy > 2*65536 )
ene->vy = 2*65536;
else if( ene->vy > 0 && ene->vy <= 4096 ){
switch ( level ){
case NOMAL:
MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
SetSE(SE_ESHOT_NOMAL); /* 敵ショット音 */
break;
case HARD:
MakeEShot(ESHOT_NOMAL, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
MakeEShot(ESHOT_NOMAL, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
MakeEShot(ESHOT_NOMAL, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
SetSE(SE_ESHOT_NOMAL); /* 敵ショット音 */
break;
}
}
if( ene->pt < obj_zako+PT_END ){
anim_num=(ene->anim_count++)/4;
ene->pt = obj_zako+PT_ST+anim_num;
}else
anim_num=7; /* パターンの最後 */
/* 背景BGとの当たり判定 */
/* 上にぶつかる */
if( (CheckBGHit(ene->x-16+ 0,ene->y-16+ 0)==GROUND_BG) /*左上*/
&& (CheckBGHit(ene->x-16+15,ene->y-16+ 0)==GROUND_BG) ){ /*右上*/
ene->ly=( ((ene->y-16)/8+1)*8+8+16 )*65536;
ene->vy=0;
}
/* 下にぶつかる */
if( (CheckBGHit(ene->x-16+ 0,ene->y-16+15)==GROUND_BG) /*左下*/
&& (CheckBGHit(ene->x-16+15,ene->y-16+15)==GROUND_BG) ){ /*右下*/
ene->ly=( ((ene->y-1)/8)*8-8+16 )*65536;
ene->vy=0;
ene->vx=0-map_vx;
ene->state=2; /* 着地 */
ene->anim_count=0;
}
/* 左にぶつかる */
if( (CheckBGHit(ene->x-16+ 0,ene->y-16+ 0)==GROUND_BG) /*左上*/
&& (CheckBGHit(ene->x-16+ 0,ene->y-16+15)==GROUND_BG) ){ /*左下*/
ene->lx=( ((ene->x-16)/8+1)*8+8+16 )*65536;
ene->vx=0-map_vx;
}
/* 右にぶつかる */
if( (CheckBGHit(ene->x-16+15,ene->y-16+ 0)==GROUND_BG) /*右上*/
&& (CheckBGHit(ene->x-16+15,ene->y-16+15)==GROUND_BG) ){ /*右下*/
ene->lx=( ((ene->x-1)/8)*8-8+16 )*65536;
ene->vx=0-map_vx;
}
break;
case 2: /* 着地 */
anim_num=(ene->anim_count++)/4;
ene->pt = obj_zako+PT_END-anim_num;
if( ene->pt < obj_zako+PT_ST ){
ene->pt = obj_zako+PT_ST;
ene->anim_count=0;
ene->state=0;
}
}
/* 画面外に出たら消去 */
if( ENE_X < 0 + 16 - 8 || ENE_X > 255 + 24 || ENE_Y > 255 + 24 )
return (0);
/* ダメージを受けた時の処理 */
if(ene->damage){
MakeEffect(EFFECT_EXPLMINI, 0, ene->x, ene->y);
SetSE(SE_EXPL_S); /* 爆発音 */
ene->player->score += 1;
return (0); /* 消去 */
}
ene->hit_p[0] = &hit_p[anim_num];
ene->hit_o[0] = &hit_o[anim_num];
ene->hit_s[0] = &hit_s[anim_num];
xsp_set_st(ene);
return(1);
}
/*
static void TiniEnemyZako02(ENEMY * p)
{
}
*/